// 返回
const timeOutBack = function(title) {
	uni.showToast({
		title: title
	})
	setTimeout(res => {
		uni.navigateBack()
	}, 2000)
}
// 对象里的值是否全为空
const objectValueAllEmpty = function(object) {
	let isEmpty = true;
	Object.keys(object).forEach(function(x) {
		if (object[x] != null && object[x] != "") {
			isEmpty = false;
		}
	});
	if (isEmpty) { //值全为空
		return true;
	}
	return false;
}
// 提示
const showModal = function(content, success, faill) {
	uni.showModal({
		title: '提示',
		content: content,
		success: function(res) {
			if (res.confirm) {
				success()
			} else if (res.cancel) {
				faill()
			}
		}
	});
}
// 获取高度
const getWindowHeight = function() {
	return uni.getSystemInfoSync().windowHeight;
}
// 防抖(debounce)
// 指触发事件后在 n 秒内函数只能执行一次，如果在 n 秒内又触发了事件，则会重新计算函数执行时间。
// 效果：短时间内多次触发同个事件，只会执行一次函数。
// 实现：setTimeOut函数
// fn是事件触发执行的函数
// wait是指等待时长，在wait时间内多次触发函数只会被执行一次
// immediate是否立即执行，true表示wait秒内触发只会执行第一次触发；false表示wait秒内触发只会执行最后一次触发
// 调用
/**
 * 
input: debounce(function(e) {
 	......
}, 1000, false)
**/
const debounce = function(fn, wait = 1000, immediate = false) {
	var timeout;
	return function() {
		let ctx = this;
		let args = arguments
		if (timeout){
			clearTimeout(timeout);
		}
		if (immediate) {
			let callNow = !timeout;
			// wait秒后清除定时器
			timeout = setTimeout(() => {
				timeout = null;
			}, wait);
			// 先执行函数
			if (callNow) fn.apply(ctx, args)
		} else {
			// wait秒后执行fn
			timeout = setTimeout(() => {
				fn.apply(ctx, args)
			}, wait);
		}
	}
}
// 节流(throttle)
// 指连续触发事件但是在 n 秒中只执行一次函数，所以节流稀释了函数执行的频率
// 效果：n秒内多次触发同个事件，只会执行一次函数，直到下一个n秒才会重新生效。
// 实现：setTimeOut函数
// fn是事件触发执行的函数
// wait是指间隔时长，在wait时间内多次触发函数只会被执行一次
// timeStamp: true时间戳版，false定时器版
// 调用
/**
 * 
input: throttle(function(e) {
 	......
}, 1000, false)
**/
const throttle = function(fn, wait = 1000, timeStamp = false) {
	let previous = 0;
	let timeout;
	return function() {
		let ctx = this;
		let args = arguments;
		if (timeStamp) {
			let now = Date.now();
			if (now - previous > wait) {
				fn.apply(ctx, args);
				previous = now;
			}
		} else {
			if (!timeout) {
				timeout = setTimeout(() => {
					timeout = null;
					fn.apply(ctx, args)
				}, wait)
			}
		}
	}
}
export default {
	timeOutBack,
	showModal,
	getWindowHeight,
	objectValueAllEmpty,
	debounce,
	throttle
}
